package org.easy.web.service.db;

import org.easy.db.DataBaseInfo;
import org.easy.db.OperatorType;
import org.easy.db.generator.GeneratorBody;
import org.easy.tool.res.Result;

import java.util.List;
import java.util.Map;

/**
 * @author wuxueli
 */
public interface DataBaseService {

    /**
     * 数据库连接
     * @param dataBase 数据库基本信息
     * @return boolean
     */
    boolean connect(DataBaseInfo dataBase);

    /**
     * 查询表名
     * @param dataBase 数据库
     * @return Map<String, List<String>>
     */
    Map<String, List<String>> getTableName(String dataBase);

    /**
     * 根据数据库查询
     * @param dataBase 数据库
     * @param sql 查询语句
     * @return List<Map<String,Object>>
     */
    List<Map<String,Object>> queryByDataBase(String dataBase,String sql);

    /**
     * 根据数据库删除
     * @param dataBase 数据库
     * @param sql 删除语句
     * @return int
     */
    int deleteByDataBase(String dataBase,String sql);

    /**
     * 根据数据库更新
     * @param dataBase 数据库
     * @param sql 更新语句
     * @return int
     */
    int updateByDataBase(String dataBase,String sql);

    /**
     * 代码生成
     * @param body 生成代码的参数
     */
    void generator(GeneratorBody body);

    /**
     * 执行alter语句
     * @param dataBase 数据库
     * @param sql alter语句
     */
    void alterSql(String dataBase,String sql);

    /**
     * 执行create语句
     * @param dataBase 数据库
     * @param sql alter语句
     */
    void createSql(String dataBase,String sql);
    /**
     * 执行sql
     * @param dataBase 数据库名
     * @param sql SQL语句
     * @return Result<?>
     */
    default Result<?> executeSql(String dataBase, String sql){
        if (sql.trim().toLowerCase().startsWith(OperatorType.select.name())) {
            return Result.success(queryByDataBase(dataBase, sql));
        } else if (sql.trim().toLowerCase().startsWith(OperatorType.update.name())){
            return Result.success(updateByDataBase(dataBase, sql));
        } else if (sql.trim().toLowerCase().startsWith(OperatorType.delete.name())) {
            return Result.success(deleteByDataBase(dataBase, sql));
        } else if (sql.trim().toLowerCase().startsWith(OperatorType.alter.name())){
            alterSql(dataBase, sql);
            return Result.success();
        } else if (sql.trim().toLowerCase().startsWith(OperatorType.create.name())){
            createSql(dataBase,sql);
            return Result.success();
        } else {
            return Result.failed();
        }
    }

}
